package fr.uniscol.dao.impl;

import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.codehaus.jackson.map.deser.ValueInstantiators.Base;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import fr.uniscol.dao.IUtilisateurDao;
import fr.uniscol.dao.UniscolDaoSupport;
import fr.uniscol.dao.mapper.UserModelRowMapper;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.IUniscolUser;
import fr.uniscol.service.IUtilisateurService;

import static fr.uniscol.dao.impl.SQLNames.*;
import fr.uniscol.model.DefaultUser;

@Repository("utilisateurDao")
public class UtilisateurDaoImpl extends UniscolDaoSupport implements IUtilisateurDao {

	@Override
	public List<DefaultUser> getAllUtilisateurOfEtablissement(BaseAnneeScolaire base) {
		
		List<DefaultUser> utilisateurs = getJdbcTemplate().query("SELECT * FROM " + TABLE_UTILISATEURS + " WHERE baseid=? ",
				new UserModelRowMapper(), 
				new Object[]{
					base.getId()
				});
		
		return utilisateurs;
	}

	@Override
	public IUniscolUser getUtilisateurById(long userId) {
		
		IUniscolUser user = getJdbcTemplate().queryForObject("SELECT * FROM " + TABLE_UTILISATEURS + " WHERE id=? ", new UserModelRowMapper(), new Object[]{userId});
		
		return user;
	}

	@Override
	public boolean saveUser(DefaultUser utilisateur) {
		
		int rowsAffected = getJdbcTemplate().update("UPDATE " + TABLE_UTILISATEURS + " SET nom=?, prenom=?, login=? WHERE id=? ", new Object[]{utilisateur.getIdentite(), "", utilisateur.getLogin(), utilisateur.getId()});
		if(rowsAffected == 0){
			// Ajout
			rowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_UTILISATEURS + "(nom, prenom, login, password,baseid) VALUES(?,?,?,?,?)", 
					new Object[]{
                        utilisateur.getNom(), 
                        utilisateur.getPrenom(), 
                        utilisateur.getLogin(), 
                        utilisateur.getPassword(), 
                        utilisateur.getBaseSelectionnee().getId()
                    });
            
            long newUserId = getJdbcTemplate().queryForObject(getLastInsertIdQuery(), Long.class);
            utilisateur.setId(newUserId);
		}
		
		return rowsAffected == 1;
	}

	@Override
	public boolean deleteUser(IUniscolUser user) {
		
		int rowsAffected = getJdbcTemplate().update("DELETE FROM " + TABLE_UTILISATEURS + " WHERE id=? ", new Object[]{user.getId()});
		
		return rowsAffected == 1;
	}

    @Override
    public List<DefaultUser> getAllUtilisateurs() {
        
        List<DefaultUser> utilisateurs = (List<DefaultUser>) getJdbcTemplate().query("SELECT * FROM " + TABLE_UTILISATEURS, new UserModelRowMapper());
        
        return utilisateurs;
    }
}
